package com.zyf.project.kvdb.client.partitioner.impl;

import com.zyf.project.kvdb.client.partitioner.Partitioner;
import org.jetbrains.annotations.NotNull;
import utils.binary.impl.Bytes;
import utils.hash.MurmurHash3;

/**
 * @author Zhou Yifan
 */
public class SimpleMurmur3HashPartitioner implements Partitioner {

    private static final int HASH_SEED = 256;

    private int partitionCount;

    public SimpleMurmur3HashPartitioner(int partitionCount) {
        this.partitionCount = partitionCount;
    }

    /**
     * 获取总的分区数
     *
     * @return int 值
     */
    @Override
    public int getPartitionCount() {
        return partitionCount;
    }

    /**
     * 计算 key 的分区地址
     *
     * @param key 要计算的 key，byte[] 类型
     * @return 分区号，int 值，从 0（含）到 {@link #getPartitionCount()}（不含）
     */
    @Override
    public int partition(byte[] key) {
        if (partitionCount == 1) {
            return 0;
        }
        int hash = MurmurHash3.murmurhash3_x86_32(key, 0, key.length, HASH_SEED);
        return partition(hash, partitionCount);
    }

    /**
     * 计算 key 的分区地址
     *
     * @param key 要计算的 key，{@link Bytes} 类型
     * @return 分区号，int 值，从 0（含）到 {@link #getPartitionCount()}（不含）
     */
    @Override
    public int partition(@NotNull Bytes key) {
        return partition(key.toBytes());
    }

    private static int partition(int hash, int partitionCount) {
        int idx = hash % partitionCount;
        return idx < 0 ? idx * (-1) : idx;
    }
}
